package genericity.bounds;

import java.io.Serializable;

/**
 * @author topjoy
 * @date 2020/8/31
 */
public class Plate<T> {


    private T item;

    public Plate(T t) {
        this.item = t;
    }

    public T get() {
        return item;
    }

    public void set(T item) {
        this.item = item;
    }


}

class Food {

}

class Fruit extends Food {

}

class Apple extends Fruit {

}

class Run {
    public static void main(String[] args) {

        // 报错,容器里装的东西之间有继承关系，但容器之间是没有继承关系的。
        // 所以我们不可以把Plate<Apple>的引用传递给Plate<Fruit>。
//        Plate<Fruit> p = new Plate<Apple>(new Apple());

        // 界指的就是extends、super后面的类，这个类就表示上界或下界
        // Fruit就是上界，上界通配符，能取Fruit及其子类的Plate
//        Food food = new Food();
//        Apple apple = new Apple();
        Plate<? extends Fruit> p2 = new Plate<>(new Apple());

        // 上界不能存任何元素，因为，只能取
//        p2.set(new Food());
//        p2.set(new Apple());
//        p2.set(new Fruit());

        // 读取出来的只能放在Fruit及其父类里
        Fruit fruit = p2.get();
//        Apple apple = p2.get(); // error
        Food food = p2.get();


        // Fruit是下界，下界通配符，能放Fruit及其父类
        Plate<? super Fruit> p3 = new Plate<>(new Food());

        // 下界不适合取元素，但可以存
        p3.set(new Apple());
        p3.set(new Fruit());

        // 取出来的元素只能放入Object中，失去了类型信息
        Object object = p3.get();

    }
}

/**
 * 泛型可以超类型可以有多个，接口和类都可以，但是最多只能有一个类，多个接口，且类要放在第一位
 */
class MultiExtends <T extends Food & Comparable<Integer> & Serializable>{



}

// 将报错
//class MultiExtends2 <T extends Comparable & Serializable & Food> {
//
//
//
//}

class Interval <T extends Comparable & Serializable> implements Serializable {
    private T lower;
    private T upper;
}

/**
 * Interval的原始类型
 */
class PrimitiveInterval <T extends Comparable & Serializable> implements Serializable {
    private Comparable lower;
    private Comparable upper;
}

/**
 * Serializable是一个标签tagging接口，就是没有方法的接口，应该放在末尾，
 * 这样效率更高，
 * @param <T>
 */
class Interval2 <T extends Serializable & Comparable> implements Serializable {

}



